#include "01_Threadpool.hpp"
#include "06_WorkThread.hpp"
#include <unistd.h>

using std::make_unique;

#define log() \
    printf("%s | %d | %s : debug\n", __FILE__, __LINE__, __FUNCTION__);

ThreadPool::ThreadPool(int thread_num, int que_size)
    :_thread_num(thread_num)
    ,_que_size(que_size)
    ,_task_que(que_size)
    ,_is_exit(false){}

void ThreadPool::start()
{
    for(int i = 0; i < _thread_num; ++i)
    {
        // 虽然Thread() 是临时对象
        // 但是make_unique<Thread> 返回的不是临时对象
        // emplace_back会构建这个对象的唯一指针
        // 保证创建的每个对象不是重复的
        
        //_threads.emplace_back(make_unique<Thread>());         // 这里实现多态需要写派生类
        //_threads.emplace_back(make_unique<WorkerThread>());   // workthread需要派生类
        _threads.emplace_back(make_unique<WorkerThread>(*this)); 
        _threads.back()->start();
    }
}

void ThreadPool::stop()
{
    while(_task_que.empty() != true)
    {
        sleep(1);
    }

    _is_exit = true;
    _task_que.wakeup();

    for(auto& thread : _threads)
    {
        log();
        if(thread->joinable()){
            thread->join();
        }
    }
}

void ThreadPool::addTask(Task* task)
{
    if(task)
    {
        _task_que.push(task);   // 类似于注册过程
    }
    log();
}

void ThreadPool::doTask()
{
    while(_is_exit == false){           // 类似于回调过程
        Task* task = _task_que.pop();
        if(task){                       // 不写这个引起了coredump
            task->process();
        }
        else{
            printf("Task == nullptr \n");
        }
    }
    log();
}

bool ThreadPool::get_is_exit()
{
    return _is_exit;
}
